package com.wanjl.aop.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author WanJl
 * @version 1.0
 * @title TeaServiceDeleteAspect
 * @description
 * @create 2024/11/3
 */
@Component
@Aspect
public class TeaServiceDeleteAspect {

    @Pointcut("execution(* com.wanjl.aop.service.TeaService.delete())")
    private void pt(){}

    @Before("pt()")
    public void beforeMethod(){
        System.out.println("前置通知......");
    }
    /*
        @After：后置通知
        在切入点方法后执行
     */
    @After("pt()")
    public void afterMethod(){
        System.out.println("后置通知......");
    }
    /*
        @AfterReturning: 返回后通知
        方法执行完成后会执行的操作
     */
    @AfterReturning("pt()")
    public void afterReturningMethod(){
        System.out.println("方法完全执行结束后......");
    }

    /**
     * @AfterThrowing：抛出异常后通知
     */
    @AfterThrowing("pt()")
    public void afterThrowingMethod(){
        System.out.println("抛出异常后通知.........");
    }

    /**
     * 环绕通知
     * @param pjp 方法形参必须是ProceedingJoinPoint，表示正在执行的连接点
     * @return 必须加返回值类型，类型为Object
     * @throws Throwable
     */
    @Around("pt()")
    public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕通知......前.......");
        Object ret = pjp.proceed(); //实际上调用的是被增强的方法
        //System.out.println("环绕通知.......返回值...."+ret.toString());
        System.out.println("环绕通知......后.......");
        return ret;
    }
}
